package com.ljx.singleMode;

/**
 * 懒汉加载单例模式
 * @作者 LJX
 * @日期 2022/12/9 16:02
 */
public class LazySingletonTest {

    public static void main(String[] args) {

        //单线程 没有问题
//        LazySingleton instance = LazySingleton.getInstance();
//        LazySingleton ins = LazySingleton.getInstance();
//        System.out.println(ins == instance);

        System.out.println("================单线程↑多线程↓===============");
        //多线程会出现线程安全问题
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                LazySingleton ls = LazySingleton.getInstance();
                System.out.println(ls);
            }).start();
        }

    }
}

class LazySingleton{

    //volatile关键字防止 指令重排 导致使用到尚未初始化的实例 引发空指针等问题
    private volatile static LazySingleton INSTANCE;

    private LazySingleton(){}

    public static LazySingleton getInstance(){
        //双重检查机制
        if(null == INSTANCE){
            synchronized (LazySingleton.class){
                if(null == INSTANCE){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    INSTANCE = new LazySingleton();
                }
            }
        }
        return INSTANCE;
    }
}
